package com.hyt.it.ogt.kq.service.bm.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.common.apiInfor.ApiResponse;
import com.hyt.it.ogt.cj.model.vo.ProjectCollectInfoVo;
import com.hyt.it.ogt.kq.service.bm.model.entity.Project;
import com.hyt.it.ogt.kq.service.bm.model.entity.ProjectSubject;
import com.hyt.it.ogt.kq.service.bm.model.vo.*;
import com.hyt.it.ogt.kq.service.model.vo.wechat.PushExamNotifyDTO;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 报名项目 服务类
 * </p>
 *
 * @author wangt
 * @since 2020-05-15
 */
public interface IProjectService extends IService<Project> {

    void saveProjectSubject(ProjectVo projectVo);

    ProjectPreviewVo previewProject(String projectId) throws Exception;

    void deleteProject(String projectId) throws Exception;

    ProjectStatVo statProjectStudent(String projectId, List<String> permissionList, String deptId);

    ProjectStatVo statProjectSubject(String projectId, List<String> permissionList, String deptId);

    List<ProjectStatVo> queryStudentProject(String officeId, String regId) throws Exception;


    List<ProjectStatVo> queryStudentProjectIgnoreSubject(String officeId, String regId) throws Exception;

    /**
     * 正在报考的项目
     *
     * @param officeId
     * @param regId
     * @return
     * @throws Exception
     */
    List<ProjectStatVo> queryStudentProjecting(String officeId, String regId);

    /***
     * 查询已经报考的项目
     * @param officeId
     * @param regId
     * @return
     * @throws Exception
     */
    List<ProjectStatVo> queryStudentProjected(String officeId, String regId);

    FirstStatVo statStudent(ProjectParam param) throws Exception;

    List<ProjectNodeVo> queryNodeList(String projectId);

    void updateNodeList(List<ProjectNodeVo> list);

    Boolean copyProject(ProjectCopyVo projectCopyVo) throws Exception;

    List<Project> queryExamProject(String officeId, Set<String> deptIds);

    String getRealOfficeId(String officeId);

    /**
     * 务管理员推送考试安排通知
     *
     * @param pushExamNotifyDTOS
     * @return
     */
    Long pushExamNotify(List<PushExamNotifyDTO> pushExamNotifyDTOS);

    Object updateProjectCollect(List<ProjectCollectInfoVo> list);

    String uploadFileToHwCloud(MultipartFile file, String fileType) throws IOException;

    /**
     * 统计报名数据
     *
     * @param projectId
     */
    void statisticProject(String projectId);

    /**
     * 为需要统计数据的报名创建任务
     */
    void createProjectStatistic();

    /**
     * 为需要统计数据的报名创建任务
     */
    void createProjectStatistic(String projectId);

    /**
     * 为已经过期了的统计数据的报名创建任务
     */
    void timeoutProjectStatistic();

    /**
     * 查询当前机构下的所有报名项目
     *
     * @param officeId 机构ID
     * @return
     */
    List<SimpleProjectVO> simpleProjectList(String officeId);

    /**
     * 查询报名项目通过报名ID
     *
     * @param projectId
     * @return
     */
    Project getProjectById(String projectId);

    /**
     * 判断科目是否有修改
     *
     * @param subject1
     * @param subject2
     * @return
     */
    boolean hasChangeSubject(ProjectSubject subject1, ProjectSubject subject2);

    /**
     * 查询分页数据
     *
     * @param projectParam
     * @return
     */
    Page<ProjectStatVo> queryPage(ProjectParam projectParam);

    /**
     * 查询报名信息通过ID
     *
     * @param id
     * @return
     */
    ProjectVo queryProjectById(String id);

    /**
     * 通过报名ID查询统计项目数据
     *
     * @param projectId
     * @return
     */
    ProjectStatVo statProjectStudent(String projectId);

    /**
     * 小程序查询机构可报名的项目，包含用户正在报名的
     *
     * @param officeId
     * @param regId
     * @return
     */
    List<ProjectStatVo> getMiniList(String officeId, String regId);

    /**
     * 上传报名海报
     *
     * @param file
     * @return
     */
    String uploadFile(MultipartFile file);

    /**
     * 获取当前登录的报名
     *
     * @param officeId
     * @param regId
     * @return
     */
    List<ProjectStatVo> queryEffectiveProject(String officeId, String regId);

    /**
     * 发布取消发布报名
     *
     * @param project
     */
    ApiResponse<Project> publishProject(Project project);
    
    /**
     * 校验报名项目名称是不是存在
     *
     * @param project
     */
    Boolean checkProjectNameExits (String projectName, String officeId);

    /**
     * 根据项目名称获取正在开放的报名任务
     * @param subjectName
     * @return
     */
    Project getOpenProjectByName(String officeId);
}
